﻿'''
题目描述
一个人设定一组四码的数字作为谜底，另一方猜。
每猜一个数，出数者就要根据这个数字给出提示，提示以XAYB形式呈现，直到猜中位置。
其中X表示位置正确的数的个数（数字正确且位置正确），而Y表示数字正确而位置不对的数的个数。
例如，当谜底为8123，而猜谜者猜1052时，出题者必须提示0A2B。
例如，当谜底为5637，而猜谜者才4931时，出题者必须提示1A0B。
当前已知N组猜谜者猜的数字与提示，如果答案确定，请输出答案，不确定则输出NA。
输入描述
第一行输入一个正整数，0＜N ＜ 100。
接下来N行，每一行包含一个猜测的数字与提示结果。
输出描述
输出最后的答案，答案不确定则输出NA。
示例1
输入
6
4815 1A1B
5716 0A1B
7842 0A1B
4901 0A0B
8585 3A0B
8555 2A1B
输出
3585
解题思路
暴力枚举所有可能的谜底，即0000~9999，然后用每一个谜底去匹配输入的猜测。如果当前谜底与输入的猜测产生的提示符合预期，则
说明该谜底是可行的。如果某个谜底可以符合所有输入的猜测，那么该谜底就是题解。如果暴力枚举出来的所有谜底中只有一个可行
的谜底，那么该谜底就是题解，否则本题无解，返回NA。
由于需要验证0000~9999这一万个可能的谜底，而每个谜底最多需要验证100个输入的猜测数字，因此该算法非常容易超时。为了优化
算法，我们可以对输入的猜测进行剪枝处理。例如，当输入的猜测提示为0A0B时，我们可以排除所有包含输入数字的谜底，因为这些
谜底与输入数字的位置和数字都不匹配。同样地，当输入的猜测提示为0A时，我们可以排除所有包含输入数字的位置的谜底，因为这
些谜底与输入数字的位置不匹配。通过对输入的猜测进行剪枝处理，我们可以大大减少需要验证的谜底数量，从而提高算法效率。
'''
#输入描述
#第一行输入一个正整数，0＜N ＜ 100。
#接下来N行，每一行包含一个猜测的数字与提示结果。
#输出描述
#输出最后的答案，答案不确定则输出NA。
'''
示例1
输入
6
4815 1A1B
5716 0A1B
7842 0A1B
4901 0A0B
8585 3A0B
8555 2A1B
输出
3585
'''
#读取输入
n = int(input())
guess_result = []
for _ in range(n):
    guess_result.append(tuple(input().split()))
real_result = []    #记录符合条件的结果
real_count = 0      #记录符合条件的数量
for num in range(10000):
    #将num转换为4位数字字符串
    test_num = f"{num:04d}"

    flag = True #判断是否符合
    #遍历猜测提示列表
    for guess,result in guess_result:
        count_a = 0 #记录A出现的次数
        count_b = 0 #记录B出现的次数

        #用来统计B：
        guess_count = [0] * 10  #记录猜测每个数字出现的次数
        test_count = [0] * 10   #记录测试每个数字出现的次数

        for i in range(len(guess)):
            guess_int = int(guess[i])
            test_int = int(test_num[i])
            if guess_int == test_int:
                count_a += 1        #相等则A：+1
            else:
                guess_count[guess_int] += 1 #猜测的当前数字次数+1
                test_count[test_int] += 1   #测试的当前数字次数+1
        count_b = sum(min(guess_count[i],test_count[i]) for i in range(10))
        expect_result = str(count_a) + 'A' + str(count_b) + 'B'
        #与提示结果不符合
        if expect_result != result:
            flag = False
            break
    if flag == True:
        real_count += 1
        real_result.append(test_num)
        if real_count > 1:  #多个符合
            break
#判断结果并输出
if len(real_result) == 1:
    print(''.join(real_result))
else:
    print("NA")
